package cn.softgame.crawler;

import java.io.File;
import java.util.Set;

/**
 * 网络爬虫
 * 
 * @author xuquan 2013-5-15
 */
public class Crawler {

	/* 使用种子 url 初始化 URL 队列 */
	private void initCrawlerWithSeeds(String[] seeds) {
		for (int i = 0; i < seeds.length; i++)
			LinkDB.addUnvisitedUrl(seeds[i]);
	}

	/* 爬取方法 */
	public void crawling(String[] seeds) {
		LinkFilter filter = new LinkFilter() {
			// 提取以http://www.csdn.net 开头的链接
			public boolean accept(String url) {
				return true;
				//if (url.startsWith("http://www.csdn.net"))
				//	return true;
				//else
				//	return false;
			}
		};
		// 初始化 URL 队列
		initCrawlerWithSeeds(seeds);
		// 循环条件：待抓取的链接不空
		while (!LinkDB.unVisitedUrlsEmpty()) {
			System.out.println("visited:"+LinkDB.getVisitedUrlNum());
			// 队头 URL 出队
			String visitUrl = LinkDB.unVisitedUrlDeQueue();
			if (visitUrl == null)
				continue;
			Downloader downLoader = new Downloader();
			// 下载网页
			String filepath = downLoader.download(visitUrl);
			// 该 url 放入到已访问的 URL 中
			LinkDB.addVisitedUrl(visitUrl);
			// 提取出下载网页中的 URL
			Set<String> links = HtmlParserTool.parseHtml(new File(filepath));
			// 新的未访问的 URL 入队
			if(links!=null){
				for (String link : links) {
					LinkDB.addUnvisitedUrl(link);
				}
			}
		}
	}

	// main 方法入口
	public static void main(String[] args) {
		Crawler crawler = new Crawler();
		crawler.crawling(new String[] {"http://www.jd.com"});
	}
}
